#include <stdio.h>
#include <stdlib.h>
#include "Arquivo.h"
#include "MaquinaEstado.h"

#define ESTADO_NEUTRO 0

class Lexer
{
private: 
	Arquivo arquivo;
	int nextChar;
	MaquinaEstado maquinaEstado;
public: 
	Lexer();
	Lexer(char* fileName);
	Lexer(FILE* file);
	Lexer(char* fileName, bool iniciarLexer);
	void iniciarLexer();
	void destruirLexer();
	void setArquivo(Arquivo arquivo);
	int getVariavelNextChar();
	void setVariavelNextChar(int nextChar);
	bool isCaracterEscape(char c);
	bool isTokenUnitario();
	Arquivo getArquivo();
	Token nextToken();
	bool fimLexer();
	bool isCaracterCurtoCircuito(char c);
	bool isCaracterUnitario(char c);
	bool isCaracterDuvisoParaCurtoCircuito(char c);
	bool verificarSeInicioTokenCurtoCircuito(std::string lexema, char c);
	bool isTokenCurtoCircuito();
};


